/**
 * 
 */
package br.com.skynix.tcmc.model.conta;

import java.math.BigDecimal;
import java.sql.Timestamp;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

import org.hibernate.annotations.ForeignKey;

import br.com.skynix.tcmc.base.model.EntidadeAuditavel;
import br.com.skynix.tcmc.model.enumeration.TipoContaEnum;
import br.com.skynix.tcmc.model.enumeration.UnidadeFederativaEnum;
import br.com.skynix.tcmc.model.oportunidade.Oportunidade;
import br.com.skynix.tcmc.model.rh.Empresa;

/**
 * @author davi
 * 
 */
@Entity
@Table(name = "tb_conta")
public class Conta extends EntidadeAuditavel {
	@ManyToOne
	@JoinColumn(name = "id_conta_fk", nullable = true,
			referencedColumnName = "id")
	@ForeignKey(name = "FK001_conta")
	private Conta conta;

	@ManyToOne
	@JoinColumn(name = "id_setor_fk", nullable = true,
			referencedColumnName = "id")
	@ForeignKey(name = "FK002_conta")
	private Setor setor;

	@ManyToOne
	@JoinColumn(name = "id_classificacao_conta_fk", nullable = true,
			referencedColumnName = "id")
	@ForeignKey(name = "FK003_conta")
	private ClassificacaoConta classificacaoConta;

	@ManyToOne
	@JoinColumn(name = "id_empresa_fk", nullable = true,
			referencedColumnName = "id")
	@ForeignKey(name = "FK004_conta")
	private Empresa empresa;

	@NotNull
	@Size(min = 3, max = 255)
	@Column(name = "nome_fantasia", nullable = false, length = 255)
	private String nomeFantasia;

	@Size(max = 255)
	@Column(name = "razao_social", nullable = true, length = 255)
	private String razaoSocial;

	@Size(max = 30)
	@Column(name = "cpf_cnpj", nullable = true, length = 30)
	private String cpfCnpj;

	@Size(max = 255)
	@Column(name = "endereco_cobranca", nullable = true, length = 255)
	private String enderecoCobranca;

	@Size(max = 5)
	@Column(name = "numero_cobranca", nullable = true, length = 5)
	private String numeroCobranca;

	@Size(max = 255)
	@Column(name = "bairro_cobranca", nullable = true, length = 255)
	private String bairroCobranca;

	@Size(max = 255)
	@Column(name = "cidade_cobranca", nullable = true, length = 255)
	private String cidadeCobranca;

	@Size(max = 2)
	@Column(name = "estado_cobranca", nullable = true, length = 2,
			columnDefinition = "CHAR(2) DEFAULT NULL")
	@Enumerated(EnumType.STRING)
	private UnidadeFederativaEnum estadoCobranca;

	@Size(max = 15)
	@Column(name = "cep_cobranca", nullable = true, length = 15)
	private String cepCobranca;

	@Size(max = 255)
	@Column(name = "complemento_cobranca", nullable = true, length = 255)
	private String complementoCobranca;

	@Size(max = 255)
	@Column(name = "endereco_entrega", nullable = true, length = 255)
	private String enderecoEntrega;

	@Size(max = 5)
	@Column(name = "numero_entrega", nullable = true, length = 5)
	private String numeroEntrega;

	@Size(max = 255)
	@Column(name = "bairro_entrega", nullable = true, length = 255)
	private String bairroEntrega;

	@Size(max = 255)
	@Column(name = "cidade_entrega", nullable = true, length = 255)
	private String cidadeEntrega;

	@Size(max = 2)
	@Column(name = "estado_entrega", nullable = true, length = 2,
			columnDefinition = "CHAR(2) DEFAULT NULL")
	@Enumerated(EnumType.STRING)
	private UnidadeFederativaEnum estadoEntrega;

	@Size(max = 15)
	@Column(name = "cep_entrega", nullable = true, length = 15)
	private String cepEntrega;

	@Size(max = 255)
	@Column(name = "complemento_entrega", nullable = true, length = 255)
	private String complementoEntrega;

	@Size(max = 255)
	@Column(nullable = true, length = 255)
	private String site;

	@Size(max = 15)
	@Column(nullable = true, length = 15)
	private String telefone;

	@Size(max = 15)
	@Column(nullable = true, length = 15)
	private String fax;

	@Size(max = 255)
	@Column(name = "administrador_contrato", nullable = true, length = 255)
	private String administradorContrato;

	@Size(max = 5)
	@Column(name = "qtd_funcionario", nullable = true, length = 5)
	private Integer quantidadeFuncionario;

	@Column(name = "receita_anual", nullable = true, precision = 15, scale = 2)
	private BigDecimal receitaAnual;

	@Column(name = "data_ult_pedido", nullable = true)
	private Timestamp dataUltimoPedido;

	@Column(nullable = true, columnDefinition = "TEXT DEFAULT NULL")
	private String observacao;

	@Size(max = 2)
	@Column(name = "flag_tipo_conta", nullable = true, length = 2,
			columnDefinition = "CHAR(2) DEFAULT NULL")
	@Enumerated(EnumType.STRING)
	private TipoContaEnum flagTipoConta;

	@Column(name = "flag_atualizado", nullable = true,
			columnDefinition = "BOOLEAN DEFAULT TRUE")
	private Boolean flagAtualizado;

	@ManyToMany(mappedBy = "contas")
	private Set<Oportunidade> oportunidades;

	/**
	 * @return the conta
	 */
	public Conta getConta() {
		return conta;
	}

	/**
	 * @param conta the conta to set
	 */
	public void setConta(Conta conta) {
		this.conta = conta;
	}

	/**
	 * @return the setor
	 */
	public Setor getSetor() {
		return setor;
	}

	/**
	 * @param setor the setor to set
	 */
	public void setSetor(Setor setor) {
		this.setor = setor;
	}

	/**
	 * @return the classificacaoConta
	 */
	public ClassificacaoConta getClassificacaoConta() {
		return classificacaoConta;
	}

	/**
	 * @param classificacaoConta the classificacaoConta to set
	 */
	public void setClassificacaoConta(ClassificacaoConta classificacaoConta) {
		this.classificacaoConta = classificacaoConta;
	}

	/**
	 * @return the empresa
	 */
	public Empresa getEmpresa() {
		return empresa;
	}

	/**
	 * @param empresa the empresa to set
	 */
	public void setEmpresa(Empresa empresa) {
		this.empresa = empresa;
	}

	/**
	 * @return the nomeFantasia
	 */
	public String getNomeFantasia() {
		return nomeFantasia;
	}

	/**
	 * @param nomeFantasia the nomeFantasia to set
	 */
	public void setNomeFantasia(String nomeFantasia) {
		this.nomeFantasia = nomeFantasia;
	}

	/**
	 * @return the razaoSocial
	 */
	public String getRazaoSocial() {
		return razaoSocial;
	}

	/**
	 * @param razaoSocial the razaoSocial to set
	 */
	public void setRazaoSocial(String razaoSocial) {
		this.razaoSocial = razaoSocial;
	}

	/**
	 * @return the cpfCnpj
	 */
	public String getCpfCnpj() {
		return cpfCnpj;
	}

	/**
	 * @param cpfCnpj the cpfCnpj to set
	 */
	public void setCpfCnpj(String cpfCnpj) {
		this.cpfCnpj = cpfCnpj;
	}

	/**
	 * @return the enderecoCobranca
	 */
	public String getEnderecoCobranca() {
		return enderecoCobranca;
	}

	/**
	 * @param enderecoCobranca the enderecoCobranca to set
	 */
	public void setEnderecoCobranca(String enderecoCobranca) {
		this.enderecoCobranca = enderecoCobranca;
	}

	/**
	 * @return the numeroCobranca
	 */
	public String getNumeroCobranca() {
		return numeroCobranca;
	}

	/**
	 * @param numeroCobranca the numeroCobranca to set
	 */
	public void setNumeroCobranca(String numeroCobranca) {
		this.numeroCobranca = numeroCobranca;
	}

	/**
	 * @return the bairroCobranca
	 */
	public String getBairroCobranca() {
		return bairroCobranca;
	}

	/**
	 * @param bairroCobranca the bairroCobranca to set
	 */
	public void setBairroCobranca(String bairroCobranca) {
		this.bairroCobranca = bairroCobranca;
	}

	/**
	 * @return the cidadeCobranca
	 */
	public String getCidadeCobranca() {
		return cidadeCobranca;
	}

	/**
	 * @param cidadeCobranca the cidadeCobranca to set
	 */
	public void setCidadeCobranca(String cidadeCobranca) {
		this.cidadeCobranca = cidadeCobranca;
	}

	/**
	 * @return the estadoCobranca
	 */
	public UnidadeFederativaEnum getEstadoCobranca() {
		return estadoCobranca;
	}

	/**
	 * @param estadoCobranca the estadoCobranca to set
	 */
	public void setEstadoCobranca(UnidadeFederativaEnum estadoCobranca) {
		this.estadoCobranca = estadoCobranca;
	}

	/**
	 * @return the cepCobranca
	 */
	public String getCepCobranca() {
		return cepCobranca;
	}

	/**
	 * @param cepCobranca the cepCobranca to set
	 */
	public void setCepCobranca(String cepCobranca) {
		this.cepCobranca = cepCobranca;
	}

	/**
	 * @return the complementoCobranca
	 */
	public String getComplementoCobranca() {
		return complementoCobranca;
	}

	/**
	 * @param complementoCobranca the complementoCobranca to set
	 */
	public void setComplementoCobranca(String complementoCobranca) {
		this.complementoCobranca = complementoCobranca;
	}

	/**
	 * @return the enderecoEntrega
	 */
	public String getEnderecoEntrega() {
		return enderecoEntrega;
	}

	/**
	 * @param enderecoEntrega the enderecoEntrega to set
	 */
	public void setEnderecoEntrega(String enderecoEntrega) {
		this.enderecoEntrega = enderecoEntrega;
	}

	/**
	 * @return the numeroEntrega
	 */
	public String getNumeroEntrega() {
		return numeroEntrega;
	}

	/**
	 * @param numeroEntrega the numeroEntrega to set
	 */
	public void setNumeroEntrega(String numeroEntrega) {
		this.numeroEntrega = numeroEntrega;
	}

	/**
	 * @return the bairroEntrega
	 */
	public String getBairroEntrega() {
		return bairroEntrega;
	}

	/**
	 * @param bairroEntrega the bairroEntrega to set
	 */
	public void setBairroEntrega(String bairroEntrega) {
		this.bairroEntrega = bairroEntrega;
	}

	/**
	 * @return the cidadeEntrega
	 */
	public String getCidadeEntrega() {
		return cidadeEntrega;
	}

	/**
	 * @param cidadeEntrega the cidadeEntrega to set
	 */
	public void setCidadeEntrega(String cidadeEntrega) {
		this.cidadeEntrega = cidadeEntrega;
	}

	/**
	 * @return the estadoEntrega
	 */
	public UnidadeFederativaEnum getEstadoEntrega() {
		return estadoEntrega;
	}

	/**
	 * @param estadoEntrega the estadoEntrega to set
	 */
	public void setEstadoEntrega(UnidadeFederativaEnum estadoEntrega) {
		this.estadoEntrega = estadoEntrega;
	}

	/**
	 * @return the cepEntrega
	 */
	public String getCepEntrega() {
		return cepEntrega;
	}

	/**
	 * @param cepEntrega the cepEntrega to set
	 */
	public void setCepEntrega(String cepEntrega) {
		this.cepEntrega = cepEntrega;
	}

	/**
	 * @return the complementoEntrega
	 */
	public String getComplementoEntrega() {
		return complementoEntrega;
	}

	/**
	 * @param complementoEntrega the complementoEntrega to set
	 */
	public void setComplementoEntrega(String complementoEntrega) {
		this.complementoEntrega = complementoEntrega;
	}

	/**
	 * @return the site
	 */
	public String getSite() {
		return site;
	}

	/**
	 * @param site the site to set
	 */
	public void setSite(String site) {
		this.site = site;
	}

	/**
	 * @return the telefone
	 */
	public String getTelefone() {
		return telefone;
	}

	/**
	 * @param telefone the telefone to set
	 */
	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}

	/**
	 * @return the fax
	 */
	public String getFax() {
		return fax;
	}

	/**
	 * @param fax the fax to set
	 */
	public void setFax(String fax) {
		this.fax = fax;
	}

	/**
	 * @return the administradorContrato
	 */
	public String getAdministradorContrato() {
		return administradorContrato;
	}

	/**
	 * @param administradorContrato the administradorContrato to set
	 */
	public void setAdministradorContrato(String administradorContrato) {
		this.administradorContrato = administradorContrato;
	}

	/**
	 * @return the quantidadeFuncionario
	 */
	public Integer getQuantidadeFuncionario() {
		return quantidadeFuncionario;
	}

	/**
	 * @param quantidadeFuncionario the quantidadeFuncionario to set
	 */
	public void setQuantidadeFuncionario(Integer quantidadeFuncionario) {
		this.quantidadeFuncionario = quantidadeFuncionario;
	}

	/**
	 * @return the receitaAnual
	 */
	public BigDecimal getReceitaAnual() {
		return receitaAnual;
	}

	/**
	 * @param receitaAnual the receitaAnual to set
	 */
	public void setReceitaAnual(BigDecimal receitaAnual) {
		this.receitaAnual = receitaAnual;
	}

	/**
	 * @return the dataUltimoPedido
	 */
	public Timestamp getDataUltimoPedido() {
		return dataUltimoPedido;
	}

	/**
	 * @param dataUltimoPedido the dataUltimoPedido to set
	 */
	public void setDataUltimoPedido(Timestamp dataUltimoPedido) {
		this.dataUltimoPedido = dataUltimoPedido;
	}

	/**
	 * @return the observacao
	 */
	public String getObservacao() {
		return observacao;
	}

	/**
	 * @param observacao the observacao to set
	 */
	public void setObservacao(String observacao) {
		this.observacao = observacao;
	}

	/**
	 * @return the flagTipoConta
	 */
	public TipoContaEnum getFlagTipoConta() {
		return flagTipoConta;
	}

	/**
	 * @param flagTipoConta the flagTipoConta to set
	 */
	public void setFlagTipoConta(TipoContaEnum flagTipoConta) {
		this.flagTipoConta = flagTipoConta;
	}

	/**
	 * @return the flagAtualizado
	 */
	public Boolean getFlagAtualizado() {
		return flagAtualizado;
	}

	/**
	 * @param flagAtualizado the flagAtualizado to set
	 */
	public void setFlagAtualizado(Boolean flagAtualizado) {
		this.flagAtualizado = flagAtualizado;
	}

	/**
	 * @return the oportunidades
	 */
	public Set<Oportunidade> getOportunidades() {
		return oportunidades;
	}

	/**
	 * @param oportunidades the oportunidades to set
	 */
	public void setOportunidades(Set<Oportunidade> oportunidades) {
		this.oportunidades = oportunidades;
	}
}